import app.Propiedad;
import app.Usuario;

import java.io.Console;
import java.io.IOException;
import java.io.FileInputStream;

import java.util.Scanner;
import java.util.ArrayList;
import java.util.Properties;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import database.*;

public class Main {

	public static void main(String[] args) {
		
		Connection con = conectarBD("database/database.properties");
		
		PropiedadDAO DBprop;
		UsuarioDAO DBuser;
		
		try {
			DBprop = new PropiedadDAO (con);
			DBuser = new UsuarioDAO (con);
		}
		catch (SQLException e){
			e.printStackTrace();
			
			return;
		}

		Usuario user_ = null;
		
		Scanner sc = new Scanner(System.in);

		int opcion = 0;

		do {
			System.out.println("1.- Registrarse.");
			System.out.println("2.- Autenticarse.");
			System.out.println("3.- Publicar Propiedad.");
			System.out.println("4.- Buscar propiedad.");
			System.out.println("0.- Salir de la aplicacion.\n");

			boolean input = true;
			
			do {
				input = true;
				System.out.print("Elija una opcion: ");
				
				try {
					opcion = Integer.parseInt(sc.nextLine().trim());
				} catch (NumberFormatException e) {
					System.out.println("\nHa introducido un valor incorrecto.");
					input = false;
				}
				
				System.out.println("");
			} while (input == false);

			switch (opcion) {
			case 0:
				System.out.println("Cerrado el sistema.\n");
				break;
			case 1:
				Usuario newUser = new Usuario();
				System.out.println("Nuevo Usuario:");
				newUser.setTipo(Usuario.NORMAL);
				
				System.out.print("Nombre: ");
				String aux = sc.nextLine().trim();
				newUser.setNombre(aux);
				
				System.out.print("Edad: ");
				int b = -1;
				while (b == -1) {
					try {
						b = Integer.parseInt(sc.nextLine().trim());
						newUser.setEdad(b);
					} catch (NumberFormatException e) {
						b = -1;
					}
				}
				System.out.print("Correo: ");
				aux = sc.nextLine().trim();
				newUser.setCorreo(aux);
				
				System.out.print("Password: ");
				aux = sc.nextLine().trim();
				newUser.setPassword(aux);
				
				System.out.print("Usuario: ");
				aux = sc.nextLine().trim();
				newUser.setUsuario(aux);
				
				if (DBuser.nuevo(newUser)) {
					System.out.println("Registrado correctamente.");
				} else {
					System.out.println("Error al registrarse.");
				}
				
				break;
			case 2:
				Console terminal = System.console();
				System.out.println("Loguearse: ");
								
				String nameaux = terminal.readLine("Usuario: ").trim();
				
				String passaux = new String(terminal.readPassword("Password: "));
				passaux = passaux.trim();
				
				user_ = DBuser.identificarse(nameaux, passaux);
				if (user_ != null)
					System.out.println("Logueado con exito");
				else
					System.out.println("Error al loguearse");
				break;
			case 3:
				Propiedad a;
				if (user_ != null) {
					a = new Propiedad();
					a.publicar(user_);
					DBprop.insertar(a);
					a.ver();
				} else {
					System.out.println("Identificate.");
					System.out.println();
				}

				break;
			case 4:
				ArrayList<String> criterio = introducirCriterio ();
				
				ArrayList<Propiedad> busqueda = DBprop.listar (criterio);
				
				if (busqueda == null)
					System.out.println ("Ninguna propiedad cumple el criterio establecido.\n");
				else
				{	
					for (int i = 0; i < busqueda.size (); i++)
						busqueda.get (i).ver();
				}
				
				break;
			default:
				System.out.println("Opcion incorrecta.\n");
			}

		} while (opcion != 0);
	}

	private static Connection conectarBD(String properties) {
		
		try {
			/*Leyendo propiedades para la BD*/
			Properties prop = new Properties();
			FileInputStream in = new FileInputStream(properties);
			prop.load(in);
			in.close();

			String drivers = prop.getProperty("jdbc.drivers");
			if (drivers != null)
				System.setProperty("jdbc.drivers", drivers);

			String url = prop.getProperty("jdbc.url");
			String user = prop.getProperty("jdbc.user");
			String password = prop.getProperty("jdbc.password");

			// Creando conexion
			return DriverManager.getConnection(url, user, password);
		}
		catch (IOException e){
			e.printStackTrace();
			return null;
		}
		catch (SQLException ex){
			ex.printStackTrace();
			return null;
		}
	}
	
	private static ArrayList<String> introducirCriterio ()
	{
        final int MENOR_QUE = 1;
        final int ENTRE = 2;
        final int MAYOR_QUE = 3;

        int criterioDimension;
        int criterioPrecio;
        int criterioTipo;

        int menorDimension;
        int mayorDimension;
        
        int menorPrecio;
        int mayorPrecio;
		
        ArrayList<String> criterio = new ArrayList<String> ();
		Scanner sc = new Scanner(System.in);

        // Establecimiento del criterio de busqueda por dimension
        System.out.println("1.- Dimension menor que una cantidad.");
        System.out.println("2.- Dimension entre dos cantidades.");
        System.out.println("3.- Dimension mayor que una cantidad.");
        System.out.println("0.- No usar este criterio.\n");
        
        do {
                System.out.print("Seleccione un criterio de busqueda por dimensiones: ");
                
                try {
                        criterioDimension = Integer.parseInt(sc.nextLine().trim());
                }
                catch (NumberFormatException e) {
                        System.out.println("\nHa introducido un valor incorrecto.");
                        criterioDimension = -1;
                }
                
                System.out.println ("");
        } while ((criterioDimension < 0) || (criterioDimension > 3));

        switch (criterioDimension) {
        case MENOR_QUE:
                System.out.print("Introduce la maxima dimension: ");
                mayorDimension = Integer.parseInt(sc.nextLine());
                System.out.println("");
                criterio.add ("Dimension maxima");
                criterio.add (String.valueOf (mayorDimension));
                break;
        case ENTRE:
                System.out.print("Introduce la minima dimension: ");
                menorDimension = Integer.parseInt(sc.nextLine());
                System.out.print("Introduce la maxima dimension: ");
                mayorDimension = Integer.parseInt(sc.nextLine());
                System.out.println("");
                criterio.add ("Dimension entre");
                criterio.add (String.valueOf (menorDimension));
                criterio.add (String.valueOf (mayorDimension));
                break;
        case MAYOR_QUE:
                System.out.print("Introduce la minima dimension: ");
                menorDimension = Integer.parseInt(sc.nextLine());
                System.out.println("");
                criterio.add ("Dimension minima");
                criterio.add (String.valueOf (menorDimension));
        }
        
        // Establecimiento del criterio de busqueda por precio
        System.out.println("1.- Precio menor que una cantidad.");
        System.out.println("2.- Precio entre dos cantidates.");
        System.out.println("3.- Precio mayor que una cantidad.");
        System.out.println("0.- No usar este criterio.\n");
        
        do {
                System.out.print("Seleccione un criterio de busqueda por dimensiones: ");
                
                try {
                        criterioPrecio = Integer.parseInt(sc.nextLine().trim());
                }
                catch (NumberFormatException e) {
                        System.out.println("\nHa introducido un valor incorrecto.");
                        criterioPrecio = -1;
                }
                
                System.out.println ("");
        } while ((criterioPrecio < 0) || (criterioPrecio > 3));

        switch (criterioPrecio) {
        case MENOR_QUE:
                System.out.print("Introduce el maximo precio: ");
                mayorPrecio = Integer.parseInt(sc.nextLine());
                System.out.println("");
                criterio.add ("Precio maximo");
                criterio.add (String.valueOf (mayorPrecio));
                break;
        case ENTRE:
                System.out.print("Introduce el minimo precio: ");
                menorPrecio = Integer.parseInt(sc.nextLine());
                System.out.print("Introduce el maximo precio: ");
                mayorPrecio = Integer.parseInt(sc.nextLine());
                System.out.println("");
                criterio.add ("Precio entre");
                criterio.add (String.valueOf (menorPrecio));
                criterio.add (String.valueOf (mayorPrecio));
                break;
        case MAYOR_QUE:
                System.out.print("Introduce el minimo precio: ");
                menorPrecio = Integer.parseInt(sc.nextLine());
                System.out.println("");
                criterio.add ("Precio minimo");
                criterio.add (String.valueOf (menorPrecio));
        }

        // Establecimiento del criterio de busqueda por tipo de inmueble
        System.out.println("1.- Solar.");
        System.out.println("2.- Piso.");
        System.out.println("3.- Casa terrera.");
        System.out.println("4.- Local comercial.");
        System.out.println("0.- No usar este criterio.\n");

        do {
                System.out.print("Seleccione un criterio de busqueda por tipo de inmueble: ");
                
                try {
                        criterioTipo = Integer.parseInt(sc.nextLine().trim());
                }
                catch (NumberFormatException e){
                        System.out.println("\nHa introducido un valor incorrecto.");
                        criterioTipo = -1;
                }
                
                System.out.println ("");
                
                if (criterioTipo != 0)
                {
                	criterio.add ("Tipo inmueble");
                	criterio.add (String.valueOf (criterioTipo));
                }
        } while ((criterioTipo < 0) && (criterioTipo > 4));
        
        return criterio;
    }
}
